﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HerGoS.WebControlExtend;
using HerGoS.ControlsUI;
using HerGoS.Viaticos.Entities;
using HerGoS.Viaticos.Engine;
using HerGoS.Administration.Engine;
using HerGoS.Administration.Entities;
using HerGoS.Interfaces;
using System.Drawing;
using System.Web.Services;
using System.IO;
using System.Text;

namespace HerGoS.WebUI.Viaticos.Liquidaciones
{
    public partial class Liquidaciones_ABM : PageBase
    {

        [WebMethod]
        public static bool HabilitarKmRecorridos(int idtransporte)
        {
            List<Transporte> listaTransporte = HttpContext.Current.Session["TipoTransporteLiquidacion"] as List<Transporte>;

            var result = listaTransporte.Find(y => y.OID == idtransporte);

            return result.CALCULOKMS;

        }


        #region Propiedades

        public Liquidacion Liquidacion
        {
            get
            {
                if (ViewState["Liquidacion"] != null)
                    return (Liquidacion)ViewState["Liquidacion"];
                return null;
            }
            set
            {
                ViewState["Liquidacion"] = value;
            }

        }

         
        public int Contador
        {
            get
            {
                if (ViewState["contador"] != null)
                    return (int)ViewState["contador"];
                return 0;
            }
            set
            {
                ViewState["contador"] = value;
            }
        }

        public int ContadorGastos
        {
            get
            {
                if (ViewState["ContadorGastos"] != null)
                    return (int)ViewState["ContadorGastos"];
                return 0;
            }
            set
            {
                ViewState["ContadorGastos"] = value;
            }
        }

        public bool CalculosOk
        {
            get
            {
                if (ViewState["Calculosok"] != null)
                    return (bool)ViewState["Calculosok"];
                return false;
            }
            set
            {
                ViewState["Calculosok"] = value;
            }
        }

        public int SolicitudId
        {
            get
            {
                if (ViewState["SolicitudId"] != null)
                    return (int)ViewState["SolicitudId"];
                return 0;
            }
            set
            {
                ViewState["SolicitudId"] = value;
            }
        }

        public int RendicionId
        {
            get
            {
                if (ViewState["RendicionId"] != null)
                    return (int)ViewState["RendicionId"];
                return 0;
            }
            set
            {
                ViewState["RendicionId"] = value;
            }
        }



        #endregion

      

        protected void Page_Load(object sender, EventArgs e)
        {
           
            if (!Page.IsPostBack)
            {
               
                this.cboTipoConcepto.DataSource = GestorTipoConcepto.Consultar();
                cboTipoConcepto.DataTextField = "Descripcion";
                cboTipoConcepto.DataValueField = "OID";
                cboTipoConcepto.DataBind();
                cboTipoConcepto.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

                
                this.cboSolicitudes.DataSource = GestorSolicitudes.Consultar();
                cboSolicitudes.DataTextField = "Numero";
                cboSolicitudes.DataValueField = "OID";
                cboSolicitudes.DataBind();
                cboSolicitudes.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

                this.cboRendiciones.DataSource = GestorRendicion.RendicionesSinLiquidacion();
                cboRendiciones.DataTextField = "NumeroRendicion";
                cboRendiciones.DataValueField = "OID";
                cboRendiciones.DataBind();
                cboRendiciones.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));
                cboSolicitudes.Enabled = false;
                // este combo se carga aca porque sino no levanta en el popup
                var ListaTransporte = new List<Transporte>();
                ListaTransporte = GestorTransporte.Consultar();
                Session["TipoTransporteLiquidacion"] = ListaTransporte;

                this.cbTransporte.DataSource = ListaTransporte;
                cbTransporte.DataTextField = "Descripcion";
                cbTransporte.DataValueField = "OID";
                cbTransporte.DataBind();
                cbTransporte.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

             //   this.txtTarifaViaticoDestino.Enabled = false;
                //this.btnGuardar.Enabled = false;
                //this.btnGuardar.CssClass = "disabled";

                if (Request.QueryString["id"] == null)
                {
                    Liquidacion = new Liquidacion();
                    numerocheque.Visible = false;
                   
                    this.btnImprimir.Visible = false;
                    // si vengo de rendicion viene id de rendicion 
                    if (Request.QueryString["rendicionid"] != null)
                    {
                         RendicionId = Request.QueryString["rendicionid"].ToInteger();

                         cboRendiciones.SelectedValue = Request.QueryString["rendicionid"].ToString();

                         numerocheque.Visible = false;

                         cboRendiciones.Load += new EventHandler(cboRendiciones_SelectedIndexChanged);
                         cboRendiciones.Enabled = false;
                    }

                    // si vengo de solicitud 
                    if (Request.QueryString["solicitudid"] != null)
                    {
                        SolicitudId = Request.QueryString["solicitudid"].ToInteger();

                        GenerarLiquidacionFromSolicitud(SolicitudId.ToString());
                        lblTitulo.Text = "Anticipo";
                        this.lblTitulo.Visible = true;
                        cboRendiciones.Enabled = false;
                        cboSolicitudes.Enabled = false;

                        numerocheque.Visible = true;;
                    }

                }
                else
                {
                    var Id = Convert.ToInt32(Request.QueryString["id"]);
                    this.btnImprimir.Visible = true;
                    Liquidacion = GestorLiquidacion.Obtener(Id);
                    hidliquidacion.Value = Liquidacion.OID.ToString();

                    cboSolicitudes.SelectedValue = Liquidacion.SolicitudLiquidada.OID.ToString();
                    
                    //si es un edicion de anticipo

                    if (Liquidacion.RendicionLiquidada == null)
                    {
                        this.lblTitulo.Text = "Anticipo";
                        this.lblTitulo.Visible = true;
                        this.hidanticipo.Value = "1";
                        numerocheque.Visible = true;
                    }
                    else
                    {
                        numerocheque.Visible = false;
                        this.lblTitulo.Visible = false; 
                        this.txtNumeroRendicion.Text = Liquidacion.RendicionLiquidada.NumeroRendicion.ToString();
                    }
                   
                    this.txtNumeroSolicitud.Text = Liquidacion.SolicitudLiquidada.Numero.ToString();
                    this.txtNumero.Text = Liquidacion.NumeroLiquidacion.ToString();
                    LoadCombos();

                    txtDNI.Text = Liquidacion.Persona.DNI;
                    txtApyNombre.Text = Liquidacion.Persona.NombresYApellidos;
                    txtCuit.Text = Liquidacion.Persona.Cuit;
                    txtFechaNac.Text = Liquidacion.Persona.FechaNacimiento == null ? null : Liquidacion.Persona.FechaNacimiento.Value.ToShortDateString();
                    this.cboArea.SelectedValue = Liquidacion.Area == null ? "0" : Liquidacion.Area.OID.ToString();
                    this.cboEntidad.SelectedValue = Liquidacion.Entidad == null ? "0" : Liquidacion.Entidad.OID.ToString(); ;
                    this.txtFechaSalida.Text = Liquidacion.FechaSalida.Value.ToShortDateString();
                    this.txtFechaRetorno.Text = Liquidacion.FechaRetorno.Value.ToShortDateString();
                    this.txtObservacion.Text = Liquidacion.Observaciones;
                    this.cboDistancia.SelectedValue = Liquidacion.Distancia == null ? "0" : Liquidacion.Distancia.OID.ToString();
                    this.txtNumeroCheque.Text = Liquidacion.NumeroCheque ?? string.Empty;
                    
                    LoadGridTramos(true);
                    LoadGridGastos();
                    this.UpdatePanelTramos.Update();
                    // se carga los totales
                    //lblCantidadViaticos.Text = String.Format("{0:0.00}", Liquidacion.CantidadViaticos);
                    //this.lblCantidadKm.Text = String.Format("{0:0.00}",Liquidacion.CantidadKms)
                    lblCantidadViaticos.Text = Liquidacion.CantidadViaticos.ToString("N2");
                    this.lblCantidadTerminal.Text = Liquidacion.CantidadTerminales.ToString();
                    this.lblCantidadKm.Text = Liquidacion.CantidadKms.ToString("N2");


                    this.lblMontoTotalViatico.Text = Liquidacion.TotalViaticos.ToString("N2");
                    this.lblTotalesTerminales.Text = Liquidacion.TotalTerminales.ToString();
                    this.lblMontoTotalGastos.Text = Liquidacion.TotalGastos.ToString("N2");
                    this.lblTotalGeneral.Text = Liquidacion.TotalAPagar.ToString("N2");
 
                    lblTotalesMontoKmRecorridos.Text = String.Format("{0:0.00}",Liquidacion.TotalKmRecorridos);
                    //lblTotalAnticipo.Text = String.Format("{0:0.00}",Liquidacion.AnticiposLiquidados);

                    lblTotalAnticipo.Text = Liquidacion.AnticiposLiquidados.ToString("N2");
                    this.cboRendiciones.Enabled = false;
                    
                  
                }
                Initialize();
            }

        }

        void Initialize()
        {
            this.btnGuardar.Settings(new ButtonExtText());
            this.btnCerrar.Settings(new ButtonExtText());

            this.GridTramos.Settings(new GridViewExtBasic());
            this.GridTramos.AllowPaging = false;
            this.btn_Cerrar_dialog_tramo.Settings(new ButtonExtText());
            this.btn_DialogTramos.Settings(new ButtonExtText());
            this.btn_AgregarTramo.Settings(new ButtonExtText());
            this.btnAgregar_Gastos.Settings(new ButtonExtText());
            btn_AgregarGastos.Settings(new ButtonExtText());
            btn_Cerrar_dialog_gastos.Settings(new ButtonExtText());
            this.btnImprimir.Settings(new ButtonExtText());
            btnGenerarCalculoLiquidacion.Settings(new ButtonExtText());
            this.GridGastos.Settings(new GridViewExtBasic());
            LoadAutoria(Liquidacion);
           
        }

        private void LoadGridTramos(bool cache)
        {
            GridTramos.DataSource = GestorTramo.Activos(Liquidacion);
            GridTramos.DataBind();
        }

        private void LoadGridGastos()
        {
            GridGastos.DataSource = GestorGasto.Activos(Liquidacion);
            GridGastos.DataBind();
        
        }
        private void LoadCombos()
        {
            this.cboArea.DataSource = GestorArea.Consultar();
            cboArea.DataTextField = "Descripcion";
            cboArea.DataValueField = "OID";
            cboArea.DataBind();
            cboArea.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboEntidad.DataSource = GestorEntidades.Consultar();
            cboEntidad.DataTextField = "Denominacion";
            cboEntidad.DataValueField = "OID";
            cboEntidad.DataBind();
            cboEntidad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            

            this.cboCiudad.DataSource = GestorCiudad.Consultar();
            cboCiudad.DataTextField = "Nombre";
            cboCiudad.DataValueField = "OID";
            cboCiudad.DataBind();
            cboCiudad.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


            this.cboCiudadDestino.DataSource = GestorCiudad.Consultar();
            cboCiudadDestino.DataTextField = "Nombre";
            cboCiudadDestino.DataValueField = "OID";
            cboCiudadDestino.DataBind();
            cboCiudadDestino.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboPorcViatico.DataSource = GestorViaticos.ConsultarPorcentajeViatico();
            this.cboPorcViatico.DataTextField = "Valor";
            this.cboPorcViatico.DataValueField = "Valor";
            cboPorcViatico.DataBind();
           

            this.cboDistancia.DataSource = GestorDistancia.Consultar();
            this.cboDistancia.DataTextField = "Descripcion";
            this.cboDistancia.DataValueField = "OID";
            cboDistancia.DataBind();
            cboDistancia.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


        }
        protected void btn_AgregarTramo_Click(object sender, EventArgs e)
        {
             try
            {
                int idtramo = hidIdTramo.Value.ToInteger();
                if (idtramo != 0)
                {
                    foreach (var item in Liquidacion.Tramos.Where(x => x.OID == idtramo))
                    {
                        item.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                        item.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue);
                        item.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                        item.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                        item.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                        item.CodigoOrigen = this.txtCodigoOrigen.Text;
                        item.ObservacionOrigen = txtObservacionOrigen.Text;
                        item.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                        item.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                        item.ObservacionDestino = this.txtObservacionesDestino.Text;

                        item.MontoTerminalOrigenIda = item.CiudadOrigen.TarifaTerminal;
                        item.MontoTerminalDestinoIda = item.CiudadDestino.TarifaTerminal;
                        //item.TarifaDiariaDestino = item.CiudadDestino.TarifaViatico;
                        item.TarifaDiariaDestino = txtTarifaViaticoDestino.Text.ToDecimal();

                        item.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0 : Convert.ToDecimal(txtKmRecorridos.Text);

                        item.DiasViaticosManual = this.chkViaticosManual.Checked;
                        if (item.DiasViaticosManual)
                        item.DiasViaticos = Convert.ToDecimal(this.txtDiasViaticos.Text);
                    }

                    LoadGridTramos(true);
                    idtramo = 0;
                }
                else
                {
                    Tramo tramo = new Tramo();
                    tramo.Transporte = GestorTransporte.Obtener(this.cbTransporte.SelectedValue.ToInteger());
                    tramo.PorcentajeViatico = Convert.ToDecimal(cboPorcViatico.SelectedValue);
                    tramo.CiudadOrigen = GestorCiudad.Obtener(this.cboCiudad.SelectedValue.ToInteger());
                    tramo.FechaOrigen = Convert.ToDateTime(txtFechaOrigen.Text + " " + txtHora.Text);
                    tramo.NroServicioOrigen = this.txtNroServicioOrigen.Text;
                    tramo.CodigoOrigen = this.txtCodigoOrigen.Text;
                    tramo.ObservacionOrigen = txtObservacionOrigen.Text;
                    tramo.CiudadDestino = GestorCiudad.Obtener(cboCiudadDestino.SelectedValue.ToInteger());
                    tramo.FechaDestino = Convert.ToDateTime(this.txtFechaDestino.Text + " " + this.txtHoraDestino.Text);
                    tramo.ObservacionDestino = this.txtObservacionesDestino.Text;
                    tramo.kmRecorridos = this.txtKmRecorridos.Text == string.Empty ? 0 : Convert.ToDecimal(txtKmRecorridos.Text);

                    tramo.MontoTerminalOrigenIda = tramo.CiudadOrigen.TarifaTerminal;
                    tramo.MontoTerminalDestinoIda = tramo.CiudadDestino.TarifaTerminal;
                    
                    tramo.TarifaDiariaDestino = tramo.CiudadDestino.TarifaViatico;

                    tramo.DiasViaticosManual = this.chkViaticosManual.Checked;
                    if (tramo.DiasViaticosManual)
                        tramo.DiasViaticos = Convert.ToDecimal(this.txtDiasViaticos.Text);


                    Contador = Contador - 1;
                    tramo.OID = Contador;
                    Liquidacion.Tramos.Add(tramo);
                    LoadGridTramos(true);
                }

                this.cbTransporte.SelectedValue = "0";
                this.cboPorcViatico.SelectedValue = "0";
                this.cboCiudad.SelectedValue = "0";
                this.txtFechaOrigen.Text = string.Empty;
                this.txtHora.Text = string.Empty;
                this.txtNroServicioOrigen.Text = string.Empty;
                this.txtCodigoOrigen.Text = string.Empty;
                this.txtObservacionOrigen.Text = string.Empty;
                this.cboCiudadDestino.SelectedValue = "0";
                this.txtFechaDestino.Text = string.Empty;
                this.txtHoraDestino.Text = string.Empty;
                this.txtObservacionesDestino.Text = string.Empty;
                this.chkViaticosManual.Checked = false;
                this.txtDiasViaticos.Text = "0";

            }

            catch (Exception ex)
            { }


        }

        //protected void chkAnularGastoIda_CheckedChanged(object sender, EventArgs e)
        //{
        //    CheckBox chkAnularGasto = (CheckBox)sender;
        //    GridViewRow row = (GridViewRow)chkAnularGasto.NamingContainer;
        //      int idTramo = Convert.ToInt32(this.GridTramos.DataKeys[row.RowIndex].Value);
        //    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularTarifaTerminalDestinoIda = true;// esto creo que funciona para update
        //}

        //protected void chkAnularGastoVuelta_CheckedChanged(object sender, EventArgs e)
        //{
        //    CheckBox chkAnularGasto = (CheckBox)sender;
        //    GridViewRow row = (GridViewRow)chkAnularGasto.NamingContainer;
        //    int idTramo = Convert.ToInt32(this.GridTramos.DataKeys[row.RowIndex].Value);
        //    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularTarifaDestinoVuelta = true;
        //}  


  
        protected void btnGenerarCalculoLiquidacion_Click(object sender, EventArgs e)
        {

            if (GridTramos.Rows.Count == 0)
            {
                return;
            }

            //Liquidacion.Anticipo = (SolicitudId > 0);
        
            foreach (GridViewRow row in this.GridTramos.Rows)
            {

                CheckBox chkAnularGastoIda = row.FindControl("chkAnularGastoIda") as CheckBox;
                CheckBox chkAnularGastoaVuelta = row.FindControl("chkAnularGastoVuelta") as CheckBox;
                int idTramo = Convert.ToInt32(GridTramos.DataKeys[row.RowIndex].Value);



                if (chkAnularGastoIda.Checked)
                {
                    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularMontoTerminalOrigenIda = true;

                }
                else
                {
                    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularMontoTerminalOrigenIda = false;  
                }

                if (chkAnularGastoaVuelta.Checked)
                {
                    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularMontoTerminalDestinoIda = true;
                }
                else
                {
                    Liquidacion.Tramos.Find(y => y.OID == idTramo).AnularMontoTerminalDestinoIda = false;
                }

            }
        


            CalculoViaticos calculoviaticos = GestorViaticos.CalcularVitaticos(Liquidacion);

            if (calculoviaticos.LiquidacionOK)
            {
                this.lblCantidadViaticos.Text = calculoviaticos.TotalCantidadViaticos.ToString();
                this.lblCantidadTerminal.Text = calculoviaticos.CantidadTerminales.ToString();
                //this.lblCantidadKm.Text = calculoviaticos.CantidadkmRecorridos.ToString("N2");
                this.lblCantidadKm.Text = calculoviaticos.CantidadkmRecorridos.ToString();
              
                //this.lblMontoTotalViatico.Text = String.Format("{0:0.00}", calculoviaticos.TotalMontoViatico);
                //lblMontoTotalGastos.Text = calculoviaticos.TotalGastos.ToString();
                //lblTotalesTerminales.Text = String.Format("{0:0.00}", calculoviaticos.TotalesTerminales);
                //lblTotalAnticipo.Text = String.Format("{0:0.00}", calculoviaticos.TotalAnticipos);
                //lblTotalesMontoKmRecorridos.Text = String.Format("{0:0.00}", calculoviaticos.TotalPrecioKmRecorridos);
                //lblTotalGeneral.Text = String.Format("{0:0.00}", calculoviaticos.TotalGeneral);

                this.lblMontoTotalViatico.Text = calculoviaticos.TotalMontoViatico.ToString("N2");
                lblMontoTotalGastos.Text = calculoviaticos.TotalGastos.ToString("N2");
                lblTotalesTerminales.Text = calculoviaticos.TotalesTerminales.ToString("N2");
                lblTotalAnticipo.Text = calculoviaticos.TotalAnticipos.ToString("N2");
                lblTotalesMontoKmRecorridos.Text = calculoviaticos.TotalPrecioKmRecorridos.ToString("N2");
                lblTotalGeneral.Text = calculoviaticos.TotalGeneral.ToString("N2");
                

                CalculosOk = true;

                this.btnGuardar.Visible = true;
             

            }
            
        
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                //if (CalculosOk)
                //{

                   this.btnGenerarCalculoLiquidacion_Click(sender, e);


                    Liquidacion.Area = GestorArea.Obtener(cboArea.SelectedValue.ToInteger());
                    Liquidacion.Entidad = GestorEntidades.Obtener(cboEntidad.SelectedValue.ToInteger());
                    Liquidacion.Distancia = cboDistancia.SelectedValue == "0"  ? null : GestorDistancia.Obtener(this.cboDistancia.SelectedValue.ToInteger());
                    Liquidacion.FechaSalida = this.txtFechaSalida.Text.ToNullableDateTime();
                    Liquidacion.FechaRetorno = this.txtFechaRetorno.Text.ToNullableDateTime();
                    Liquidacion.Observaciones = this.txtObservacion.Text;
                    Liquidacion.NumeroCheque = this.txtNumeroCheque.Text;
                    //Liquidacion.Anticipo = Liquidacion.Anticipo;

                    Liquidacion.CantidadViaticos = this.lblCantidadViaticos.Text.ToDecimal();
                    Liquidacion.CantidadTerminales = this.lblCantidadTerminal.Text.ToInteger();
                    Liquidacion.CantidadKms = this.lblCantidadKm.Text.ToInteger();
                    Liquidacion.TotalViaticos = this.lblMontoTotalViatico.Text.ToDecimal();
                    Liquidacion.TotalTerminales = this.lblTotalesTerminales.Text.ToDecimal();
                    Liquidacion.TotalGastos = this.lblMontoTotalGastos.Text.ToDecimal();
                    Liquidacion.TotalKmRecorridos = this.lblTotalesMontoKmRecorridos.Text.ToDecimal();
                    Liquidacion.AnticiposLiquidados = this.lblTotalAnticipo.Text.ToDecimal();
                    
                    Liquidacion.TotalAPagar = this.lblTotalGeneral.Text.ToDecimal();


                    GestorLiquidacion.Guardar(Liquidacion);
                    Liquidacion = GestorLiquidacion.Obtener(Liquidacion.OID);
                    this.txtNumero.Text = Liquidacion.NumeroLiquidacion.ToString();

                    var numero = this.txtNumero.Text;

                    string script = string.Empty;
                    if (this.SolicitudId > 0)
                    {
                        script = @"$(function(){{parent.NotificarAnticipo('{0}');}});";
                        script = string.Format(script, numero);
                    }
                    else if (this.RendicionId > 0)
                    {

                        script = @"$(function(){{parent.NotificarLiquidacion('{0}');}});";
                        script = string.Format(script, numero);
                    
                    }
                    else
                    {
                        script = @"$(function(){{parent.IntervaloCerrarPopup('{0}');}});";
                        script = string.Format(script, numero);
                    }
                                        
                    ScriptManager.RegisterStartupScript(Page, typeof(Page), "closedialog", script, true);
                }
            //}

            catch (Exception ex)
            { }


        }
        protected void GridTramos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Borrar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int id = Convert.ToInt32(GridTramos.DataKeys[index].Value);


                if (id > 0)
                {
                    Tramo tramo = Liquidacion.Tramos.Where(x => x.OID == id).FirstOrDefault();
                    tramo.Persistencia = EstadoPersistencia.DELETE;

                }
                else
                {
                    Liquidacion.Tramos.RemoveAt(index);

                }
                LoadGridTramos(true);
            }

            if (e.CommandName == "Editar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int oid = Convert.ToInt32(GridTramos.DataKeys[index].Value);
                hidIdTramo.Value = oid.ToString();
                Tramo tramo;
                tramo = Liquidacion.Tramos.Find(y => y.OID == oid);

                this.cbTransporte.SelectedValue = tramo.Transporte.OID.ToString();
                this.cboPorcViatico.SelectedValue = tramo.PorcentajeViatico == 0 ? "0" : Convert.ToString(tramo.PorcentajeViatico);
                cboCiudad.SelectedValue = tramo.CiudadOrigen == null ? "0" : tramo.CiudadOrigen.OID.ToString();
                string hora = tramo.FechaOrigen.Value.ToString("HH:mm");
                this.txtFechaOrigen.Text = tramo.FechaOrigen.Value.ToShortDateString();
                this.txtHora.Text = hora;
                this.txtNroServicioOrigen.Text = tramo.NroServicioOrigen;
                this.txtCodigoOrigen.Text = tramo.CodigoOrigen;
                this.txtObservacionOrigen.Text = tramo.ObservacionOrigen;
                cboCiudadDestino.SelectedValue = tramo.CiudadDestino == null ? "0" : tramo.CiudadDestino.OID.ToString();
                string horaDestino = tramo.FechaDestino.Value.ToString("HH:mm");
                this.txtFechaDestino.Text = tramo.FechaDestino.Value.ToShortDateString();
                this.txtHoraDestino.Text = horaDestino;
                this.txtObservacionesDestino.Text = tramo.ObservacionDestino;
                this.txtKmRecorridos.Text = tramo.kmRecorridos.ToString();
               
                this.txtTarifaViaticoDestino.Text = tramo.TarifaDiariaDestino.ToString();
                this.txtTarifaViaticoDestino.Enabled = true;

                this.chkViaticosManual.Checked = tramo.DiasViaticosManual;
                this.txtDiasViaticos.Text = tramo.DiasViaticos.ToString();
                


                UpdatePanel3.Update();

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "Editar(); ", true);
            }

        }

        protected void GridTramos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                if (Borrar != null)
                {
                    Borrar.Settings(new ImageButtonExtDelete());
                }
                
                ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
                if (Editar != null)
                {

                    Editar.Settings(new ImageButtonExtEdit());
                    
                }
            }

        }

        protected void GenerarLiquidacionFromSolicitud(string solicitudId )
        {
            LoadCombos();
            cboSolicitudes.SelectedValue = solicitudId;
            Solicitud solicitudSelected = GestorSolicitudes.Obtener(this.cboSolicitudes.SelectedValue.ToInteger());

            // guardo los tres objetos mas importantes liquidacion : Rendicion en null , solicitud y persona.
            Liquidacion.RendicionLiquidada = null; ;
            Liquidacion.SolicitudLiquidada = solicitudSelected;
            Liquidacion.Persona = solicitudSelected.Persona;
            Liquidacion.Anticipo = (SolicitudId > 0);

            txtNumeroRendicion.Text = string.Empty;

            this.txtNumeroSolicitud.Text = solicitudSelected.Numero.ToString();

            txtDNI.Text = solicitudSelected.Persona.DNI;
            txtApyNombre.Text = solicitudSelected.Persona.NombresYApellidos;
            txtCuit.Text = solicitudSelected.Persona.Cuit;
            txtFechaNac.Text = solicitudSelected.Persona.FechaNacimiento == null ? null : solicitudSelected.Persona.FechaNacimiento.Value.ToShortDateString();

            this.cboArea.SelectedValue = solicitudSelected.Area == null ? "0" : solicitudSelected.Area.OID.ToString();
            this.cboEntidad.SelectedValue = solicitudSelected.Entidad == null ? "0" : solicitudSelected.Entidad.OID.ToString(); ;
            this.txtFechaSalida.Text = solicitudSelected.FechaSalida.Value.ToShortDateString();
            this.txtFechaRetorno.Text = solicitudSelected.FechaRetorno.Value.ToShortDateString();
            this.cboDistancia.SelectedValue = solicitudSelected.Distancia == null ? "0" : solicitudSelected.Distancia.OID.ToString();
            
            this.txtObservacion.Text = solicitudSelected.Observaciones;
            Liquidacion.Tramos = solicitudSelected.Clone();
            LoadGridTramos(true);


            this.UpdatePanelTramos.Update();
            this.UpdateObservacion.Update();

        }




         protected  void cboRendiciones_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadCombos();

            Rendicion rendicionSelected = GestorRendicion.Obtener(cboRendiciones.SelectedValue.ToInteger());
            
             // guardo los tres objetos mas importantes liquidacion : Rendicion , solicitud y persona.
             Liquidacion.RendicionLiquidada = rendicionSelected;
             Liquidacion.SolicitudLiquidada = rendicionSelected.SolicitudRendida;
             Liquidacion.Persona = rendicionSelected.Persona;


            txtNumeroRendicion.Text = rendicionSelected.NumeroRendicion.ToString();
            this.txtNumeroSolicitud.Text = rendicionSelected.SolicitudRendida.Numero.ToString();
            cboSolicitudes.SelectedValue = rendicionSelected.SolicitudRendida.OID.ToString();

            Persona persona = rendicionSelected.Persona;
            txtDNI.Text = persona.DNI;
            txtApyNombre.Text = persona.NombresYApellidos;
            txtCuit.Text = persona.Cuit;
            txtFechaNac.Text = persona.FechaNacimiento == null ? null : persona.FechaNacimiento.Value.ToShortDateString();

            this.cboArea.SelectedValue = rendicionSelected.Area == null ? "0" : rendicionSelected.Area.OID.ToString();
            this.cboEntidad.SelectedValue = rendicionSelected.Entidad == null ? "0" : rendicionSelected.Entidad.OID.ToString(); ;
            this.txtFechaSalida.Text = rendicionSelected.FechaSalida.Value.ToShortDateString();
            this.txtFechaRetorno.Text = rendicionSelected.FechaRetorno.Value.ToShortDateString();
            this.cboDistancia.SelectedValue = rendicionSelected.Distancia == null ? "0" : rendicionSelected.Distancia.OID.ToString();   
            this.txtObservacion.Text = rendicionSelected.Observaciones;
            Liquidacion.Tramos = rendicionSelected.Clone();
            LoadGridTramos(true);
                        

            this.UpdatePanelTramos.Update();
            this.UpdateObservacion.Update();
         
         }

         protected void GridGastos_RowCommand(object sender, GridViewCommandEventArgs e)
         {
             if (e.CommandName == "Borrar")
             {
                 int index = Convert.ToInt32(e.CommandArgument);
                 int id = Convert.ToInt32(GridGastos.DataKeys[index].Value);


                 if (id > 0)
                 {
                     Gastos gasto = Liquidacion.LGastos.Where(x => x.OID == id).FirstOrDefault();
                     gasto.Persistencia = EstadoPersistencia.DELETE;

                 }
                 else
                 {
                     Liquidacion.LGastos.RemoveAt(index);

                 }
                 LoadGridGastos();
             }
             if (e.CommandName == "Editar")
             {
                 int index = Convert.ToInt32(e.CommandArgument);
                 int oid = Convert.ToInt32(GridGastos.DataKeys[index].Value);
                 this.hidgasto.Value = oid.ToString();
                 Gastos gasto;
                 gasto = Liquidacion.LGastos.Find(y => y.OID == oid);
                 this.txtFechaGasto.Text = gasto.FechaGasto.Value.ToShortDateString();
                 this.txtCuit.Text = gasto.Cuit;
                 this.cboTipoConcepto.SelectedValue = gasto.TipoConcepto.OID.ToString();
                 this.txtConcepto.Text = gasto.Concepto;
                 this.txtMontoGasto.Text = gasto.MontoGasto.ToString();


                 UpdatePanel4.Update();

                 ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "DialogGastos(); return false;", true);
             }

             
         }

         protected void GridGastos_RowDataBound(object sender, GridViewRowEventArgs e)
         {
             if (e.Row.RowType == DataControlRowType.DataRow)
             {
                 ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                 if (Borrar != null)
                 {
                     Borrar.Settings(new ImageButtonExtDelete());
                 }


             }
            
             ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
             if (Editar != null)
             {

                 Editar.Settings(new ImageButtonExtEdit());

             }

         }
         
        protected void btn_AgregarGastos_Click(object sender, EventArgs e)
         {

             try
             {
                 int idGasto = this.hidgasto.Value.ToInteger();
                 if (idGasto != 0)
                 {
                     foreach (var item in Liquidacion.LGastos.Where(x => x.OID == idGasto))
                     {
                         item.FechaGasto = this.txtFechaGasto.Text.ToNullableDateTime();
                         item.Cuit = this.txtCuit.Text;
                         item.TipoConcepto = this.cboTipoConcepto.SelectedValue == "0" ? null : GestorTipoConcepto.Obtener(this.cboTipoConcepto.SelectedValue.ToInteger()); 
                         item.Concepto = this.txtConcepto.Text;
                         item.MontoGasto = this.txtMontoGasto.Text.ToDecimal();
                     }

                     LoadGridGastos();
                     hidgasto.Value = "0";
                 }
                 else
                 {
                     Gastos gasto = new Gastos();

                     gasto.FechaGasto = this.txtFechaGasto.Text.ToNullableDateTime();
                     gasto.Cuit = this.txtCuit.Text;
                     gasto.TipoConcepto = GestorTipoConcepto.Obtener(this.cboTipoConcepto.SelectedValue.ToInteger());
                     gasto.Concepto = this.txtConcepto.Text;
                     gasto.MontoGasto = this.txtMontoGasto.Text.ToDecimal();
                     this.ContadorGastos = ContadorGastos - 1;
                     gasto.OID = ContadorGastos;
                     Liquidacion.LGastos.Add(gasto);
                     LoadGridGastos();
                 
                 }


             }
             catch (Exception ex)
             { }
        
              
        
        
        
        
        }

        protected void btnImprimir_Click(object sender, EventArgs e)
        {
            if (Liquidacion.RendicionLiquidada != null)
            {

                string script = @"$(function(){{parent.Imprimir('{0}');}});";

                script = string.Format(script, Liquidacion.OID.ToString());

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "liquidacion", script, true);
            }
            else
            {
                   string script = @"$(function(){{parent.ImprimirAnticipo('{0}');}});";

                script = string.Format(script, Liquidacion.OID.ToString());

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "antliquidacion", script, true);
            
            
            
            }

        }
            
       


    }
}